home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / TEMP / GNU / bison / LexicalTie < prev    next >
Text File  |  1995-06-28  |  2KB  |  52 lines

  1. Lexical Tie-ins
  2. Previous: <Semantic Tokens=>SemanticTo> * Next: <Tie-in Recovery=>TieinRecov> * Up: <Context Dependency=>ContextDep>
  3.  
  4. #Wrap on
  5. {fH3}Lexical Tie-ins{f}
  6.  
  7. One way to handle context-dependency is the {fUnderline}lexical tie-in{f}: a flag
  8. which is set by Bison actions, whose purpose is to alter the way tokens are
  9. parsed.
  10.  
  11. For example, suppose we have a language vaguely like C, but with a special
  12. construct {fEmphasis}hex ({fStrong}hex-expr{f}){f}.  After the keyword {fCode}hex{f} comes
  13. an expression in parentheses in which all integers are hexadecimal.  In
  14. particular, the token {fEmphasis}a1b{f} must be treated as an integer rather than
  15. as an identifier if it appears in that context.  Here is how you can do it:
  16.  
  17. #Wrap off
  18. #fCode
  19. %\{
  20. int hexflag;
  21. %\}
  22. %%
  23. expr:   IDENTIFIER
  24.         | constant
  25.         | HEX '('
  26.                 \{ hexflag = 1; \}
  27.           expr ')'
  28.                 \{ hexflag = 0;
  29.                    $$ = $4; \}
  30.         | expr '+' expr
  31.                 \{ $$ = make\_sum ($1, $3); \}
  32.         …
  33.         ;
  34.  
  35. constant:
  36.           INTEGER
  37.         | STRING
  38.         ;
  39. #f
  40. #Wrap on
  41.  
  42. Here we assume that {fCode}yylex{f} looks at the value of {fCode}hexflag{f}; when
  43. it is nonzero, all integers are parsed in hexadecimal, and tokens starting
  44. with letters are parsed as integers if possible.
  45.  
  46. The declaration of {fCode}hexflag{f} shown in the C declarations section of
  47. the parser file is needed to make it accessible to the actions 
  48. (\*Note <C Declarations=>CDeclarati>: The C Declarations Section).  You must also write the code in {fCode}yylex{f}
  49. to obey the flag.
  50.  
  51.